package com.wyw.learning.thread.collections.concurrenthashmap;

/**
 * ConcurrentHashMap
 *
 * java 7
 *  由一个个Segment构成，每个Segment由一个个链表构成（就像一个hashmap，仍然是数组和链表组成的拉链法）
 *  每个segment独立上ReentrantLock锁，每个segment互不影响，提高了并发效率
 *  默认是有16个Segment，所以最多可以同时支持16个线程（操作分布不同的Segment上），可以初始化时设置其他值，但是一旦初始化以后，就不可以扩容了。
 * Java 8
 *  和HashMap非常相似，一个个Node每个Node可以是链表，也可以是红黑树
 *
 * 为什么读操作不加锁，https://www.cnblogs.com/keeya/p/9632958.html
 *
 * 为什么要ConcurrentHashMap的结构从1.7变成了1.8的结构
 *  数据结构：见上，从默认的16变成了现在的每个node都是独立的，并发度提升了
 *  Hash碰撞：java7会使用拉链法，java8中会先使用拉链法，达到条件后在使用红黑树的方法
 *  保证并发安全：java7采用分段锁   java8 cas+synchronized（既然使用了Synchronized，为什么还要使用cas呢，可见put方法源码，大致：syn和cas的时机和位置是不同的，优先是cas,直到put成功，有必要时再使用synchronized，比如在红黑树的转换过程）
 *  时间复杂度：遍历链表O(n)，遍历红黑树O(log(n))
 *      为什么转成红黑树的阈值是8（红黑树占用空间是链表的两倍）
 *      遵循泊松分布：详见源码327行前后注释，概率千万分之几，一般情况下不会转成红黑树的
 *
 *      However, statistically, under random hash codes, this is not a common problem.  Ideally, the
 *      frequency of nodes in bins follows a Poisson distribution
 *      (http://en.wikipedia.org/wiki/Poisson_distribution) with a
 *      parameter of about 0.5 on average, given the resizing threshold
 *      of 0.75, although with a large variance because of resizing
 *      granularity.
 *
 *
 *
 * @author Mr Wu    yewen.wu.china@gmail.com
 * <p>
 * Update History:
 * Author        Time            Content
 */
public class ConcurrentHashMapDemo {
//    new ConcurrentHashMap
}
